#include "BlockQueue.hpp"
#include"Task.hpp"
#include <pthread.h>
#include <unistd.h>
#include <ctime>
#include <functional>

using namespace bpModule;

//方法1
// using namespace TaskModule;

// void *Consumer(void *args)
// {   
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
//     while(true)
//     {

//         Task t;
//         //1. 从bq拿到数据
//         bq->Pop(&t);
        
//         // 2.做处理
//         t.Execute();
//         printf("Consumer, 处理完成一个任务: %d+%d=%d\n", t.X(), t.Y(), t.Result());
       
//     }
// }

// void *Productor(void *args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
//     while (true)
//     {
//         //1. 模拟从外部获取数据
//         int x = rand() % 10 + 1; // [1, 10]
//         int y = rand() % 20 + 1; // [1, 20]
//         Task t(x, y); // 构建任务
//         sleep(1);

//         // 2. 生产到bq中
//         bq->Equeue(t);

//         printf("producter 生产了一个任务: %d+%d=?\n", t.X(), t.Y());
//     }
// }

// int main()
// {
//     srand(time(nullptr) ^ getpid());
//     // 交易场所，不仅仅可以用来进行传递数据
//     // 传递任务！！！v1: 对象 v2
//     BlockQueue<Task> *bq = new BlockQueue<Task>(5); // 共享资源 -> 临界资源
    
//     // 单生产，单消费
//     pthread_t c1, p1; 
//     pthread_create(&c1, nullptr, Consumer, bq);
//     pthread_create(&p1, nullptr, Productor, bq);


//     pthread_join(c1, nullptr);
//     pthread_join(p1, nullptr);

//     delete bq;
//     return 0;
// }


//方法2
void test()
{
    std::cout << "haha test..." << std::endl;
}

void hello()
{
    std::cout << "hehe hello" << std::endl;
}// 长传，下载，刷新，入库，同步等各种

using task_t = std::function<void()>;



void *Consumer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    while(true)
    {
        task_t t;
        bq->Pop(&t);
        
        // 2.做处理
        t();
        printf("Consumer, 处理完成一个任务\n");
    }
}

void *Productor(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    while (true)
    {
        // 1. 从外部获取数据
        sleep(1);
        // 2. 生产到bq中
        bq->Equeue(test);

        printf("producter 生产了一个任务\n");
    }
}

int main()
{
    srand(time(nullptr) ^ getpid());
    // 交易场所，不仅仅可以用来进行传递数据
    // 传递任务！！！v1: 对象 v2

    BlockQueue<task_t> *bq = new BlockQueue<task_t>(5); // 共享资源 -> 临界资源
    // 单生产，单消费
    pthread_t c1, p1; 
    pthread_create(&c1, nullptr, Consumer, bq);
    pthread_create(&p1, nullptr, Productor, bq);


    pthread_join(c1, nullptr);
    pthread_join(p1, nullptr);

    delete bq;
    return 0;
}
